<!DOCTYPE HTML>
<html>

<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>第 4 页 | backend | DeepThought</title>
  <meta name="google-site-verification" content="Ei6mmDdf-cJwox1RvJOeX8Dc720fqWjZQu-Ww2BjBt4">
  
  <meta name="author" content="积慕">
  
  <meta name="description" content="个人博客知识分享,知识需沉淀,更需分享">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:site_name" content="DeepThought">

  
  <meta property="og:image" content>
  

  <link href="https://pic.zhuliang.ltd/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link rel="alternate" href="/atom.xml" title="DeepThought" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">

  <link rel="stylesheet" href="//at.alicdn.com/t/font_1187293_8fec2ou5fyx.css">

  <!-- <link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.6.0/styles/github.min.css"> -->
  <!-- <script src="//cdn.bootcss.com/highlight.js/9.6.0/highlight.min.js"></script> -->
  <script src="/js/highlight.min.js"></script>

  <link rel="stylesheet" href="/css/markdown.css">

  <script src="/js/av-min.3.0.4.js"></script>
  <script src="/js/Valine.min.1.3.6.js"></script>

</head></html>

<body>
  <header id="header" class="inner"><div class="alignleft">
  <h1><a href="/">DeepThought</a></h1>
  <h2><a href="/">知识需沉淀，更需分享</a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/about">关于我</a></li>
    
      <li><a href="/atom.xml">订阅RSS</a></li>
    
  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div>
        </header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper">
<h2  style="background:#fff; border-bottom: 1px solid #ddd; padding-bottom:17.5px; padding-top:17.5px; padding-left:5px;margin-bottom: 0px;color:#999;font-weight:normal;text-shadow:0 0 1px #fff;">
  <i class="iconfont  icon-category" style="margin-right:5px;"></i>
   分类：backend</h2>


  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-attributemapping.html">Elasticsearch.Nest 教程系列 4-2 映射：Attribute mapping | 通过特性进行映射</a></h1>
  


      
        <time datetime="2020-01-16T06:34:01.000Z">
          create: 2020-01-16 14:34:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;587&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>使用自动映射的时候，NEST 会将 POCO 模型属性的数据类型自动推断出对应的 ES 数据类型。同样，NEST 也提供了一系列特性，方便你进行一些定制。</p>
<p><strong>唯一需要注意的是，虽然使用特性进行了映射，但依然需要调用 .AutoMap() 方法，以便在特性上自定义的值生效。</strong> </p>
<p>示例：</p>
<p>在 Employee 和 Skill 类上使用特性</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-attributemapping.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-automapping.html">Elasticsearch.Nest 教程系列 4-1 映射：Auto mapping | 自动映射</a></h1>
  


      
        <time datetime="2020-01-16T03:07:01.000Z">
          create: 2020-01-16 11:07:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.3k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;6&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>类似于 dynamic mapping，在创建索引或通过 Put Mapping API 创建映射时，NEST 提供了一种称为自动映射的功能，该功能可以从正在映射的 CLR POCO 属性类型自动推断出正确的 Elasticsearch 字段数据类型。 </p>
<h1 id="一个简单示例："><a href="#一个简单示例：" class="headerlink" title="一个简单示例："></a>一个简单示例：</h1><ul>
<li>新建 Document 抽象基类。</li>
<li>新建 Company 类</li>
<li>新建 Employee 类</li>
<li>三者关系如下</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-automapping.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-mapping.html">Elasticsearch.Nest 教程系列 4 映射</a></h1>
  


      
        <time datetime="2020-01-16T02:40:01.000Z">
          create: 2020-01-16 10:40:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;481&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;1&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<blockquote>
<p>虽然 ES 可以自动推断部分类型（如 string, bool, number）并进行映射，但无法满足在所有业务场景，显式指定模型映射至关重要。</p>
<p>本章节主要说明如何通过 NEST 将 .NET 中 POCOs 模型的属性跟 ES 中存储的 JSON 文档和字段进行映射。</p>
</blockquote>
<p>NEST 提供了如下几种转换方式：</p>
<ul>
<li>Auto mapping：自动转换，根据 POCO 属性类型进行推断，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-automapping.html">NEST 教程系列 4-1 映射：Auto mapping | 自动映射</a></li>
<li>Attribute mapping：通过特性进行映射，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-attributemapping.html">NEST 教程系列 4-2 映射：Attribute mapping | 通过特性进行映射</a></li>
<li>Fluent mapping：流畅映射，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-fluentmapping.html">NEST 教程系列 4-3 映射：Fluent mapping | 流畅映射</a></li>
<li>through the Visitor Pattern：通过 Visitor 模式进行映射，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-visitor-pattern.html">NEST 教程系列 4-4 映射：through the Visitor Pattern | 通过访客模式进行映射</a></li>
<li>Parent/Child relationships：子父级关系映射，，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-parent-child-relationships.html">NEST 教程系列 4-5 映射：Parent/Child relationships | 子父级关系映射</a></li>
</ul>
<p>以上几种映射方式可以组合起来以形成整体映射方法。</p>
<p>此外，还有一些控制方法：</p>
<ul>
<li>Ignoring properties：忽略属性，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Ignoring-properties.html">NEST 教程系列 4-6 映射：Ignoring properties | 映射时忽略 POCO 上的某些属性</a></li>
<li>Multi fields：多字段，见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-multifields.html">NEST 教程系列 4-7 映射：Multi fields | 多字段映射</a></li>
</ul>

      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Extending-Nest-Types.html">Elasticsearch.Nest 教程系列 3-2 序列化：Extending NEST types | 扩展 NEST 类型</a></h1>
  


      
        <time datetime="2020-01-15T09:55:01.000Z">
          create: 2020-01-15 17:55:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;546&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<blockquote>
<p>NEST 的默认 JSON 序列化知道如何正确的序列化所有请求和响应类型，以及如何正确处理的你的 .NET 模型类。然而有的时候，你可能需要修改默认行为或者自定义你自己的序列化器，本章节将说明如何自定义以及扩展 NEST 类型。</p>
</blockquote>
<hr>
<p>有时为了解决某些问题，或者因为你使用了扩展了 Elasticsearch 功能的第三方插件，需要你提供某一种类型的自定义实现，而 NEST 并没有提供现成的支持。这个时候就可以通过如下方式来扩展 NEST 的类型使得在某些场景支持：</p>
<h1 id="创建你自己的属性映射"><a href="#创建你自己的属性映射" class="headerlink" title="创建你自己的属性映射"></a>创建你自己的属性映射</h1><p>通过实现自定义的 IProperty 实现，将 POCO 属性跟 NEST 字段进行映射。</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class MyPluginProperty : IProperty
{
    IDictionary&lt;string, object&gt; IProperty.LocalMetadata { get; set; }
    public string Type { get; set; } = &quot;my_plugin_property&quot;;
    public PropertyName Name { get; set; }

    public MyPluginProperty(string name, string language)
    {
        this.Name = name;
        this.Language = language;
        this.Numeric = true;
    }

    [PropertyName(&quot;language&quot;)]
    public string Language { get; set; }

    [PropertyName(&quot;numeric&quot;)]
    public bool Numeric { get; set; }
}
</code></pre>
<ul>
<li>PropertyNameAttribute 特性用于标记应序列化的属性。如果没有此属性，NEST将不会选择该属性进行序列化。</li>
</ul>
<p>在创建索引的时候使用自定义的 IProperty 实现</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Extending-Nest-Types.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-custom-serialization.html">Elasticsearch.Nest 教程系列 3-1 序列化：Custom Serialization | 自定义序列化</a></h1>
  


      
        <time datetime="2020-01-15T08:17:01.000Z">
          create: 2020-01-15 16:17:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;2k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;8&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<blockquote>
<p>NEST 的默认 JSON 序列化知道如何正确的序列化所有请求和响应类型，以及如何正确处理的你的 .NET 模型类。然而有的时候，你可能需要修改默认行为或者自定义你自己的序列化器，本章节将说明如何自定义以及扩展 NEST 类型。</p>
</blockquote>
<hr>
<p>目前 NEST 客户端已经完全移除了 SimpleJson 和 Newtonsoft.Json，转而使用内置的 Utf8Json—一种直接与 UTF-8 二进制文件直接协同工作的快速序列化器。</p>
<p>随着转而使用 UtfJson，NEST 团队在 7.x 阶段删除了部分原先在之前 NEST 客户端中存在的 JSON 特性，变动如下：</p>
<ul>
<li>由于性能原因，由 Utf8Json 生成的 JSON 不会缩进。如请求中的 JSON 不会缩进，哪怕指定了 SerializationFormatting.Indented。但 NEST 团队正在考虑公开缩进 JSON 的选项以便于开发和调试。</li>
<li>NEST 类型不能通过继承扩展。在 6.x 版本，可以通过派生该类型并注释这些新属性来为该类型包括其他属性。在当前使用 Utf8Json 进行序列化的时候，此方法将不起作用。</li>
<li>序列化器使用 Reflection.Emit，而 Utf8Json 使用 Reflection.Emit 来生成高效的格式化器。但并非所有平台都支持 Reflection.Emit，例如 UWP，Xamarin.iOS 和 Xamarin.Android。</li>
<li>Elasticsearch.Net.DynamicResponse 将 JSON 数组反序列化为 List<object>。SimpleJson 将 JSON 数组反序列化为 object[]。但出于分配和性能方面的原因，Utf8Json 将它们反序列化为 List<object>。</object></object></li>
<li>将 JSON 对象字段名称反序列化为 C＃ 类的属性时，Utf8Json 更加严格。在 6.x 版本中，内部使用 Json.NET 进行序列化，JSON 对象字段名称会先跟 C＃ 的类属性名完全匹配的进行匹配，之后再使用不区分大小写的进行匹配。但在 7.x 版本中（使用 Utf8Json 后），名称必须完全匹配。</li>
</ul>
<h1 id="注入新的序列化器"><a href="#注入新的序列化器" class="headerlink" title="注入新的序列化器"></a>注入新的序列化器</h1><p>通过注入新的序列化器，可以让你在_source，_fields 或希望写入和返回用户提供的值的任何地方对（反）序列化进行调用。</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-custom-serialization.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-working-with-certificates.html">Elasticsearch.Nest 教程系列 2-4 连接：Working with certificates | 使用凭证连接</a></h1>
  


      
        <time datetime="2020-01-15T07:57:01.000Z">
          create: 2020-01-15 15:57:01 | update: 2020-01-23 12:13:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;823&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<h1 id="使用证书"><a href="#使用证书" class="headerlink" title="使用证书"></a>使用证书</h1><p>如果你已经通过 Elastic Stack Security 功能在 Elasticsearch 上启用了SSL，或者在 ES 服务上层的代理上启用了SSL，并且生成证书的证书颁发机构（CA）受运行客户端代码的计算机信任，那么你不需要进行任何操作。</p>
<p>如果你使用不受信任的 CA 证书（如你自己生成的CA 证书），默认情况下， .NET 不允许你使用 https 请求终结点，不过你可以使用 ServicePointManager.ServerCertificateValidationCallback 来解决这个问题。大部分的示例可能会让你直接返回一个 true，但并不建议你这样做，因为这么设置会允许所有到你应用程序域的 HTTPS 的流量，且无需验证：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">//不建议这么干：
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, errors) =&gt; true
</code></pre>
<ul>
<li>这么设置不会对 HTTPS 连接请求jinxing yanzheng </li>
</ul>
<h1 id="配置验证"><a href="#配置验证" class="headerlink" title="配置验证"></a>配置验证</h1><p>可以使用 Elasticsearch.Net 的 ConnectionConfiguration 和使用 NEST 的ConnectionSettings 公开该回调。你也可以在这处理程序中进行自己的验证，也可以使用静态类 CertificateValidations 提供的一些处理器。</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-working-with-certificates.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-ConnectionPool.html">Elasticsearch.Nest 教程系列 2-2 连接：Connection pools | 连接池使用</a></h1>
  


      
        <time datetime="2020-01-14T09:56:01.000Z">
          create: 2020-01-14 17:56:01 | update: 2020-01-23 11:31:42
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.4k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;5&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>连接池是一个内部机制，它主要关注于集群中注册的节点以及判断 NEST 可以使用那些节点来发送客户端的请求。</p>
<ul>
<li>P.S.：此连接池非彼连接池（跟ADO.NET 中的数据库连接池不同），NEST 的连接池并不负责管理跟 ES 服务器的 TCP 连接。<ul>
<li>到 ES 服务端的 TCP 连接由 DESKTOP CLR 中的 ServicePointManager 负责，更多关于 ServicePointManager <a href="https://blogs.msdn.microsoft.com/adarshk/2005/01/02/understanding-system-net-connection-management-and-servicepointmanager/" target="_blank" rel="noopener">见此</a>。</li>
</ul>
</li>
</ul>
<p>ES 中的连接池的作用：负责管理 ES 集群中可以建立连接的节点，并且一个 IConnectionPool 示例与一个 ConnectionSetting 示例相关联（一一对应关联）。</p>
<p>由于单个 NEST 客户端建议使用’单例’，因此单个连接池实例的生命周期跟应用程序的生命周期相同。</p>
<p>一共包含以下 5 个类型的连接池</p>
<ul>
<li>SingleNodeConnectionPool</li>
<li>CloudConnectionPool</li>
<li>StaticConnectionPool</li>
<li>SniffingConnectionPool</li>
<li>StickyConnectionPool</li>
</ul>
<h1 id="SingleNodeConnectionPool"><a href="#SingleNodeConnectionPool" class="headerlink" title="SingleNodeConnectionPool"></a>SingleNodeConnectionPool</h1><blockquote>
<p>一般 SingleNodeConnectionPool 适用于集群中只有一个节点或者只有单个复杂均衡实例的情况。</p>
</blockquote>
<p>当没有在 ConnectionSettings 构造函数中显式指定连接池类型的时候，此类型是默认连接池，也是在所有类型中最简单的一种连接池类型。<br>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-ConnectionPool.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Modify-DefaultConnection.html">Elasticsearch.Nest 教程系列 2-3 连接：Modifying the default connection | 修改默认连接</a></h1>
  


      
        <time datetime="2020-01-14T07:17:01.000Z">
          create: 2020-01-14 15:17:01 | update: 2020-01-15 11:32:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;701&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>NEST 客户端通过 IConnection 发送请求并创建响应，默认实现使用 System.Net.Http.HttpClient。</p>
<p>有的时候，你希望客制化连接，此时可以通过 InMemoryConnection，HttpConnection 来自定义。</p>
<h1 id="使用-InMemoryConnection"><a href="#使用-InMemoryConnection" class="headerlink" title="使用 InMemoryConnection"></a>使用 InMemoryConnection</h1><p>InMemoryConnection 是一个内置的 IConnection，可以轻松地对其编写单元测试。通过配置，可以将调用时的默认响应字节、HTTP 状态代码和异常处理进行客制化。</p>
<p>事实上，InMemoryConnection 并不会发送任何请求或接收来自E lasticsearch 的任何响应：如果将 .DisableDirectStreaming 在全局或请求的时候设置为 true，则此请求仍会序列化，并且可以在响应上获取请求字节。</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var connection = new InMemoryConnection();
var connectionPool = new SingleNodeConnectionPool(new Uri(&quot;http://localhost:9200&quot;));
/*
    1.通过 IConnectionPool 和 IConnection 重载创建一个 ConnectionSettings
    2.connection 使用的是 InMemoryConnection 的无参构造函数，表示为所有相应内容返回 200 状态码，并不真实执行任何 IO 操作。
*/
var settings = new ConnectionSettings(connectionPool, connection);
var client = new ElasticClient(settings);
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Modify-DefaultConnection.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Index-Name-Inference.html">Elasticsearch.Nest 教程系列 9-1 转换：Index name inference | 索引名推断的3种方式</a></h1>
  


      
        <time datetime="2020-01-13T09:27:01.000Z">
          create: 2020-01-13 17:27:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;548&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>NEST 提供了多种方式来推断索引名，不同方式可以同时指定，但相互之间存在优先级关系，具体如下：</p>
<h1 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h1><p>配置类：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class ElasticSearchSettings
{
    public string ServerUri { get; set; }
    public string DefaultIndex { get; set; } = &quot;defaultindex&quot;;
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Index-Name-Inference.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-ConfigurationOptions.html">Elasticsearch.Nest 教程系列 2-1 连接：Configuration options | 配置选项</a></h1>
  


      
        <time datetime="2020-01-11T05:37:01.000Z">
          create: 2020-01-11 13:37:01 | update: 2020-01-11 13:37:01
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.9k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;7&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>NEST 默认情况下使用预设的值与 ElasticSearch 集群进行交互，并提供了许多配置选项和组件来修改默认值（行为）。</p>
<p>你可以修改 ConnectionConfiguration 和 ConnectionStrings 的属性以达到修改默认连接行为的效果：</p>
<ul>
<li>ConnectionConfiguration：面向 ElasticSearch.Net。</li>
<li>ConnectionStrings：面向 NEST。</li>
</ul>
<h1 id="配置-ConnectionConfiguration"><a href="#配置-ConnectionConfiguration" class="headerlink" title="配置 ConnectionConfiguration"></a>配置 ConnectionConfiguration</h1><blockquote>
<p>因为 ConnectionStrings 继承自 ConnectionConfiguration，所以以下选项（方法/属性）适用于 ConnectionConfiguration 和 ConnectionStrings。</p>
</blockquote>
<ul>
<li><strong>ApiKeyAuthentication：</strong> 与所有请求一起发送到Elasticsearch的 Api Key。</li>
<li><strong>BasicAuthentication：</strong> 与所有请求一起发送到Elasticsearch的 基本身份验证凭证。</li>
<li><strong>ClientCertificate：</strong> 为所有 HTTP 请求使用 X509Certificate 认证。你也可以在每一个请求上通过 ClientCertificates 属性来进行设置。</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-ConfigurationOptions.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  

  <nav id="pagination">
  
    <a href="/categories/backend/page/3/" class="alignleft prev">上一页</a>
  
  
    <a href="/categories/backend/page/5/" class="alignright next">下一页</a>
  
  <div class="clearfix"></div>
</nav>
</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-category"></i>&nbsp;&nbsp;分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/categories/PowerUser/">PowerUser</a><small>4</small></li>
  
    <li><a href="/categories/backend/">backend</a><small>57</small></li>
  
    <li><a href="/categories/frontend/">frontend</a><small>9</small></li>
  
    <li><a href="/categories/operations/">operations</a><small>5</small></li>
  
    <li><a href="/categories/提前退休/">提前退休</a><small>2</small></li>
  
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-new3"></i>&nbsp;&nbsp;最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2024/11/PowerUser/install-docker-in-pve-lxc.html">1. 通过 PVE LXC 搭建 docker 环境</a>
      </li>
    
      <li>
        <a href="/2024/11/Obsidian/obsidian-render-pie-chart.html">2. 2 套用于 obsidian 的生成时间占用饼图脚本示例，基于 templater， charts，echarts+dataview</a>
      </li>
    
      <li>
        <a href="/2024/10/PowerUser/fix-ios18-samba-readonly-issue.html">3. 解决 ios 18（包括ipadOS 18） 下通过文件(files app)连接 samba 服务器，目录变成只读权限的问题</a>
      </li>
    
      <li>
        <a href="/2023/07/operations/how-to-use-pm2.html">4. PM2 的安装、配置和使用</a>
      </li>
    
      <li>
        <a href="/2023/07/backend/expose-intranet-netcoreapi-to-internet.html">5. 通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中</a>
      </li>
    
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-tag"></i>&nbsp;&nbsp;标签</h3>
  <ul class="entry">
  
    <li><a href="/tags/net-core/">.net core</a><small>12</small></li>
  
    <li><a href="/tags/Debian/">Debian</a><small>2</small></li>
  
    <li><a href="/tags/Docker/">Docker</a><small>1</small></li>
  
    <li><a href="/tags/Elasticsearch/">Elasticsearch</a><small>35</small></li>
  
    <li><a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a><small>35</small></li>
  
    <li><a href="/tags/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/tags/PVE/">PVE</a><small>2</small></li>
  
    <li><a href="/tags/StackExchange-Redis系列/">StackExchange.Redis系列</a><small>12</small></li>
  
    <li><a href="/tags/centos/">centos</a><small>3</small></li>
  
    <li><a href="/tags/flex/">flex</a><small>1</small></li>
  
    <li><a href="/tags/ios/">ios</a><small>1</small></li>
  
    <li><a href="/tags/javascript/">javascript</a><small>1</small></li>
  
    <li><a href="/tags/linux/">linux</a><small>4</small></li>
  
    <li><a href="/tags/nginx/">nginx</a><small>2</small></li>
  
    <li><a href="/tags/nuget/">nuget</a><small>2</small></li>
  
    <li><a href="/tags/react/">react</a><small>6</small></li>
  
    <li><a href="/tags/styled-components/">styled-components</a><small>1</small></li>
  
    <li><a href="/tags/内网穿透/">内网穿透</a><small>4</small></li>
  
    <li><a href="/tags/培训讲义/">培训讲义</a><small>2</small></li>
  
    <li><a href="/tags/基础知识/">基础知识</a><small>2</small></li>
  
    <li><a href="/tags/性能优化/">性能优化</a><small>2</small></li>
  
    <li><a href="/tags/教程/">教程</a><small>64</small></li>
  
    <li><a href="/tags/理财/">理财</a><small>2</small></li>
  
    <li><a href="/tags/生命周期/">生命周期</a><small>1</small></li>
  
    <li><a href="/tags/经验/">经验</a><small>4</small></li>
  
  </ul>
</div>


  
  <script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
  <script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
  <div class="widget tag">
    <h3 class="title"><i class="iconfont icon-cloud1"></i>&nbsp;&nbsp;标签云</h3>
    <div id="myCanvasContainer" class="widget tagcloud">
      <canvas width="250" height="250" id="resCanvas" style="width:100%">
        <a href="/tags/net-core/" style="font-size: 17.14px;">.net core</a> <a href="/tags/Debian/" style="font-size: 11.43px;">Debian</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/Elasticsearch/" style="font-size: 18.57px;">Elasticsearch</a> <a href="/tags/Elasticsearch-Nest系列/" style="font-size: 18.57px;">Elasticsearch.Nest系列</a> <a href="/tags/Obsidian/" style="font-size: 10px;">Obsidian</a> <a href="/tags/PVE/" style="font-size: 11.43px;">PVE</a> <a href="/tags/StackExchange-Redis系列/" style="font-size: 17.14px;">StackExchange.Redis系列</a> <a href="/tags/centos/" style="font-size: 12.86px;">centos</a> <a href="/tags/flex/" style="font-size: 10px;">flex</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/linux/" style="font-size: 14.29px;">linux</a> <a href="/tags/nginx/" style="font-size: 11.43px;">nginx</a> <a href="/tags/nuget/" style="font-size: 11.43px;">nuget</a> <a href="/tags/react/" style="font-size: 15.71px;">react</a> <a href="/tags/styled-components/" style="font-size: 10px;">styled-components</a> <a href="/tags/内网穿透/" style="font-size: 14.29px;">内网穿透</a> <a href="/tags/培训讲义/" style="font-size: 11.43px;">培训讲义</a> <a href="/tags/基础知识/" style="font-size: 11.43px;">基础知识</a> <a href="/tags/性能优化/" style="font-size: 11.43px;">性能优化</a> <a href="/tags/教程/" style="font-size: 20px;">教程</a> <a href="/tags/理财/" style="font-size: 11.43px;">理财</a> <a href="/tags/生命周期/" style="font-size: 10px;">生命周期</a> <a href="/tags/经验/" style="font-size: 14.29px;">经验</a>
      </canvas>
    </div>
  </div>




</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">

  
  &copy; 2018 - 2024 &nbsp;<a href='/about'>积慕</a>
  
  &nbsp;&nbsp;<a href='https://www.cnblogs.com/deepthought/'>我的博客园地址</a>
  &nbsp;&nbsp;finalclassic#outlook.com
</div>

<div class="clearfix"></div>
<div>
  本站主题基于：<a href='https://github.com/hexojs/hexo-theme-light' rel="external nofollow">hexo-theme-light</a>
</div>
<div id="busuanzi_container_site_pv">
  本站总访问量&nbsp;<span id="busuanzi_value_site_pv"></span>&nbsp;次
</div>
<div style="width:300px;margin:0 auto; padding:20px 0;">
  <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011702004805" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
    <img src="https://pic.zhuliang.ltd/20200102164648.png" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">沪公网安备 31011702004805号</p></a>
</div></footer>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<script type="text/javascript">
hljs.initHighlightingOnLoad();
</script>

<!-- <script src="/js/busuanzi.pure.mini.js"></script> -->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script>
    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ea793b9c8d6b31df666a6bc15038e246";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
</body>
</html>
